package jdklearning.function;


import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;

/**
 * 只包含一个抽象方法的接口，可以用@FunctionalInterface进行注解。
 * 函数式接口既可以通过实例执行重写的方法，也可以作为其他函数的形参，在其他函数中调用重写的方法。
 * 在java.util.function包下定义了很多函数式接口，最核心的4个函数式接口是：
 * // 消费型接口 Consumer<T> 	void accept()
 * // 供给型接口 Supplier<T> 	T get()
 * // 函数型接口 Function<T, R> R apply(T t)
 * // 断定型接口 Predicate<T>	boolean test(T t)
 *
 * 此外还有些函数式接口不是定义在java.util.function包中，如：
 *
 * // 可执行接口 Runnable 		void run()
 * // 比较器接口 Comparator<T>  int compare(T o1, T o2)
 * https://blog.csdn.net/new_delete_/article/details/107465438
 * @author shenenlu 2021年05月17日 上午10:27:56
 */
public class LambdaAndMethodAndFunction {

    public static void testMethod(){

    }


    public static void main(String[] args) {
        Comparator<String> com1 = (s1, s2) -> s1.compareTo(s2);
        Comparator<String> com2 = (s1, s2) -> s1.compareTo(s2);
        Comparator<String> com3 = new Comparator<String>(){
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        };
        Comparator<String> com4 = String::compareTo;
        Comparator<String> com5 = String::compareTo;

        System.out.println(com1);
        System.out.println(com2);
        System.out.println(com3);
        System.out.println(com4);
        System.out.println(com5);

        Runnable test = LambdaAndMethodAndFunction::testMethod;
        Runnable test1 = LambdaAndMethodAndFunction::testMethod;
        Runnable test2 = new Runnable() {
            @Override
            public void run() {

            }
        };

        System.out.println( test);
        System.out.println( test1);
        System.out.println( test2);


        Set<Comparator<String>> lambdaSet = new HashSet<>();
        Set<Runnable> functionSet = new HashSet<>();
        Set<Runnable> anonymousSet = new HashSet<>();
        int i=0;
        while (i < 10){
            lambdaSet.add((s1, s2) -> s1.compareTo(s2));
            functionSet.add(LambdaAndMethodAndFunction::testMethod);
            anonymousSet.add(new Runnable() {
                @Override
                public void run() {

                }
            });
            i++;
        }
        System.out.println(lambdaSet.size());
        System.out.println(functionSet.size());
        System.out.println(anonymousSet.size());

    }

}
